﻿import numpy as np
import matplotlib.pyplot as plt

# 创建数据
x = np.linspace(0, 2 * np.pi, 100)  # 0到2π之间的100个点
y = np.sin(x)

# 创建图形
plt.figure(figsize=(10, 6))  # 设置图形大小
plt.plot(x, y, label='sin(x)')  # 绘制线图
plt.title('Sine Wave')  # 标题
plt.xlabel('x')  # x轴标签
plt.ylabel('sin(x)')  # y轴标签
plt.grid(True)  # 显示网格
plt.legend()  # 显示图例
plt.show()  # 显示图形


# 创建多个函数的数据
x = np.linspace(-2 * np.pi, 2 * np.pi, 200)
y_sin = np.sin(x)
y_cos = np.cos(x)
y_tan = np.tan(x)
# 处理tan函数的无穷大值
y_tan = np.clip(y_tan, -10, 10)  # 将值限制在-10到10之间

# 绘制多个图形
plt.figure(figsize=(12, 8))

plt.subplot(2, 2, 1)  # 2行2列的第1个位置
plt.plot(x, y_sin, 'r-', linewidth=2)
plt.title('Sine Function')
plt.grid(True)

plt.subplot(2, 2, 2)  # 2行2列的第2个位置
plt.plot(x, y_cos, 'b--', linewidth=2)
plt.title('Cosine Function')
plt.grid(True)

plt.subplot(2, 2, 3)  # 2行2列的第3个位置
plt.plot(x, y_tan, 'g-.', linewidth=2)
plt.title('Tangent Function')
plt.grid(True)
plt.ylim(-10, 10)  # 设置y轴范围

plt.subplot(2, 2, 4)  # 2行2列的第4个位置
plt.plot(x, y_sin, 'r-', label='sin(x)')
plt.plot(x, y_cos, 'b--', label='cos(x)')
plt.title('Sine and Cosine Functions')
plt.grid(True)
plt.legend()

plt.tight_layout()  # 自动调整子图参数
plt.show()



# 创建随机数据
np.random.seed(42)  # 设置随机种子以确保结果可重现
x = np.random.randn(100)
y = np.random.randn(100)
colors = np.random.rand(100)
sizes = 100 * np.random.rand(100)

# 绘制散点图
plt.figure(figsize=(10, 6))
plt.scatter(x, y, c=colors, s=sizes, alpha=0.7, cmap='viridis')
plt.colorbar()  # 显示颜色条
plt.title('Random Scatter Plot')
plt.xlabel('X values')
plt.ylabel('Y values')
plt.grid(True, alpha=0.3)
plt.show()



# 创建正态分布数据
data = np.random.normal(0, 1, 1000)

# 绘制直方图
plt.figure(figsize=(10, 6))
plt.hist(data, bins=30, alpha=0.7, color='skyblue', edgecolor='black')
plt.title('Histogram of Normal Distribution')
plt.xlabel('Value')
plt.ylabel('Frequency')
plt.grid(True, alpha=0.3)
plt.show()



# 创建二维数据
data = np.random.rand(10, 10)

# 绘制热力图
plt.figure(figsize=(8, 6))
plt.imshow(data, cmap='hot', interpolation='nearest')
plt.colorbar()
plt.title('Heatmap of Random Data')
plt.show()


# 创建二维函数数据
x = np.linspace(-5, 5, 100)
y = np.linspace(-5, 5, 100)
X, Y = np.meshgrid(x, y)
Z = np.sin(np.sqrt(X**2 + Y**2))

# 绘制等高线图
plt.figure(figsize=(10, 8))
contour = plt.contour(X, Y, Z, 20, cmap='RdYlBu')
plt.clabel(contour, inline=True, fontsize=8)
plt.title('Contour Plot of sin(sqrt(x^2 + y^2))')
plt.xlabel('x')
plt.ylabel('y')
plt.colorbar()
plt.show()



from mpl_toolkits.mplot3d import Axes3D

# 创建3D数据
x = np.linspace(-5, 5, 50)
y = np.linspace(-5, 5, 50)
X, Y = np.meshgrid(x, y)
Z = np.sin(np.sqrt(X**2 + Y**2))

# 创建3D图形
fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(111, projection='3d')

# 绘制3D表面
surf = ax.plot_surface(X, Y, Z, cmap='viridis', edgecolor='none', alpha=0.8)

# 添加颜色条
fig.colorbar(surf, ax=ax, shrink=0.5, aspect=5)

ax.set_title('3D Surface Plot')
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
plt.show()



# 创建随机图像数据
image_data = np.random.rand(100, 100, 3)  # 随机RGB图像

# 显示图像
plt.figure(figsize=(8, 6))
plt.imshow(image_data)
plt.title('Random RGB Image')
plt.axis('off')  # 隐藏坐标轴
plt.show()

# 使用NumPy创建更有趣的图像模式
x = np.linspace(0, 1, 100)
y = np.linspace(0, 1, 100)
X, Y = np.meshgrid(x, y)
Z = np.sin(10 * X) * np.cos(10 * Y)

plt.figure(figsize=(8, 6))
plt.imshow(Z, cmap='plasma')
plt.colorbar()
plt.title('Pattern Created with NumPy Functions')
plt.axis('off')
plt.show()


# 创建自定义颜色映射
from matplotlib.colors import LinearSegmentedColormap

# 定义颜色映射
colors = [(0, 'blue'), (0.5, 'green'), (1, 'red')]
custom_cmap = LinearSegmentedColormap.from_list('custom', colors)

# 创建数据
data = np.random.rand(10, 10)

# 使用自定义颜色映射
plt.figure(figsize=(8, 6))
plt.imshow(data, cmap=custom_cmap)
plt.colorbar()
plt.title('Heatmap with Custom Colormap')
plt.show()



# from matplotlib.animation import FuncAnimation
# from IPython.display import HTML

# # 创建动画数据
# x = np.linspace(0, 2 * np.pi, 100)
# frames = []

# for phase in np.linspace(0, 2 * np.pi, 50):
#     y = np.sin(x + phase)
#     frames.append(y)

# # 创建动画
# fig, ax = plt.subplots(figsize=(8, 6))
# line, = ax.plot(x, frames[0])
# ax.set_xlim(0, 2 * np.pi)
# ax.set_ylim(-1.1, 1.1)
# ax.set_title('Animated Sine Wave')
# ax.grid(True)

# def update(frame):
#     line.set_ydata(frames[frame])
#     return line,

# # 创建动画对象
# ani = FuncAnimation(fig, update, frames=len(frames), interval=50, blit=True)

# # 在Jupyter笔记本中显示动画
# # HTML(ani.to_jshtml())

# # 保存动画
# # ani.save('sine_wave_animation.gif', writer='pillow', fps=20)

# plt.show()



# 创建信号处理示例
# 生成信号
t = np.linspace(0, 1, 1000)
signal = np.sin(2 * np.pi * 5 * t) + 0.5 * np.sin(2 * np.pi * 20 * t)

# 添加噪声
noise = 0.2 * np.random.randn(len(t))
noisy_signal = signal + noise

# 计算傅里叶变换
freqs = np.fft.fftfreq(len(t), t[1] - t[0])
fft_values = np.fft.fft(noisy_signal)
fft_magnitude = np.abs(fft_values)

# 绘制信号和频谱
plt.figure(figsize=(12, 8))

plt.subplot(2, 1, 1)
plt.plot(t, noisy_signal, label='Noisy Signal')
plt.plot(t, signal, 'r-', linewidth=2, label='Original Signal')
plt.title('Time Domain Signal')
plt.xlabel('Time (s)')
plt.ylabel('Amplitude')
plt.legend()
plt.grid(True)

plt.subplot(2, 1, 2)
plt.plot(freqs[:len(freqs)//2], fft_magnitude[:len(freqs)//2])
plt.title('Frequency Domain (Magnitude Spectrum)')
plt.xlabel('Frequency (Hz)')
plt.ylabel('Magnitude')
plt.grid(True)

plt.tight_layout()
plt.show()


# # 创建分类数据集可视化
# from sklearn.datasets import make_classification

# # 生成分类数据
# X, y = make_classification(n_samples=1000, n_features=2, n_redundant=0, 
#                            n_informative=2, n_clusters_per_class=1, random_state=42)

# # 绘制散点图
# plt.figure(figsize=(10, 8))
# scatter = plt.scatter(X[:, 0], X[:, 1], c=y, cmap='viridis', alpha=0.7)
# plt.colorbar(scatter)
# plt.title('Classification Dataset')
# plt.xlabel('Feature 1')
# plt.ylabel('Feature 2')
# plt.grid(True, alpha=0.3)
# plt.show()




# 对于大型数据集，使用更高效的绘图方法
# 创建大型数据集
large_x = np.linspace(0, 10, 1000000)
large_y = np.sin(large_x) + 0.1 * np.random.randn(1000000)

# 常规绘图（可能很慢）
# plt.plot(large_x, large_y)

# 更高效的方法：下采样或使用更简单的绘图方法
# 方法1：下采样
sample_indices = np.random.choice(len(large_x), 10000, replace=False)
sample_indices.sort()
plt.figure(figsize=(10, 6))
plt.plot(large_x[sample_indices], large_y[sample_indices])
plt.title('Downsampled Large Dataset')
plt.grid(True)
plt.show()

# 方法2：使用hexbin对于大型数据集
plt.figure(figsize=(10, 6))
plt.hexbin(large_x, large_y, gridsize=50, cmap='viridis')
plt.colorbar()
plt.title('Hexbin Plot for Large Dataset')
plt.show()





# 创建示例图形
x = np.linspace(0, 2 * np.pi, 100)
y = np.sin(x)

plt.figure(figsize=(10, 6))
plt.plot(x, y)
plt.title('Sine Wave')
plt.grid(True)

# 保存为不同格式
plt.savefig('sine_wave.png', dpi=300, bbox_inches='tight')  # PNG格式
plt.savefig('sine_wave.pdf', bbox_inches='tight')  # PDF格式
plt.savefig('sine_wave.svg', bbox_inches='tight')  # SVG格式

plt.show()






